package main

import (
	"net"
	"os"
)

/*
import (
	"github.com/goftp/server"
	"github.com/goftp/server/user"
	"log"
)

func main() {
	// 创建一个用户存储器
	userStore := user.NewSimpleUserStore()
	userStore.AddUser("user", "pass", "/path/to/ftp/root") // 设置用户名、密码和根目录

	// 创建 FTP 服务器
	ftpServer := &server.Server{
		Auth:        userStore,
		Factory:     &server.FileDriverFactory{}, // 使用文件驱动
		PassivePort: "30000-30010",               // 被动模式端口范围
	}

	// 启动服务器
	log.Println("Starting FTP server on :21")
	if err := ftpServer.ListenAndServe(":21"); err != nil {
		log.Fatal(err)
	}
}
*/

import (
	"github.com/jlaffaye/ftp"
	"log"
)

const (
	ftpPort = ":21"          // FTP 服务器端口
	rootDir = "D://ftp_root" // 根目录
)

type FTPServer struct {
	listener net.Listener
}

func (s *FTPServer) Start() error {
	var err error
	s.listener, err = net.Listen("tcp", ftpPort)
	if err != nil {
		return err
	}
	log.Printf("FTP server started on %s\n", ftpPort)

	for {
		conn, err := s.listener.Accept()
		if err != nil {
			log.Printf("Failed to accept connection: %v\n", err)
			continue
		}
		go s.handleConnection(conn)
	}
}

func (s *FTPServer) handleConnection(conn net.Conn) {
	defer conn.Close()
	log.Printf("Client connected: %s\n", conn.RemoteAddr())

	// 创建 FTP 服务器实例
	ftpServer := ftp.NewServer(ftp.NewConfig())
	ftpServer.SetDriver(ftp.NewFileDriver(rootDir))

	// 启动 FTP 服务器
	if err := ftpServer.Serve(conn); err != nil {
		log.Printf("Failed to serve FTP connection: %v\n", err)
	}
}

func main() {
	// 确保根目录存在
	os.MkdirAll(rootDir, os.ModePerm)

	// 启动 FTP 服务器
	server := &FTPServer{}
	if err := server.Start(); err != nil {
		log.Fatal(err)
	}
}
